/**
 * 与前端完全一致的Agent集成测试
 * 使用相同的配置和调用方式
 */

import { MastraClient } from '@mastra/client-js';

console.log('🚀 开始Agent集成测试（与前端一致的方式）...\n');

// 使用与前端相同的配置
const MASTRA_CONFIG = {
  baseUrl: 'http://localhost:4111',
  retries: 3,
  backoffMs: 300,
  maxBackoffMs: 5000,
};

console.log('📡 Mastra配置:', MASTRA_CONFIG);

// 创建客户端实例
const client = new MastraClient(MASTRA_CONFIG);

console.log('🔧 客户端创建完成');
console.log('- client类型:', typeof client);
console.log('- client.agent类型:', typeof client.agent);

// 检查客户端结构
console.log('\n🔍 客户端结构检查:');
console.log('- 可用属性:', Object.keys(client));

if (client.agent) {
  console.log('- agent属性存在:', typeof client.agent);
  console.log('- agent.run方法:', typeof client.agent.run);
} else {
  console.log('❌ agent属性不存在');
}

async function testGameMasterAgent() {
  console.log('\n📋 测试1: 游戏主控Agent...');
  
  try {
    if (!client.agent || !client.agent.run) {
      throw new Error('client.agent.run 方法不可用');
    }

    console.log('   🔄 调用游戏主控Agent...');
    
    const startTime = Date.now();
    const result = await client.agent.run({
      agentId: 'gameMasterAgent',
      messages: [
        {
          role: 'user',
          content: `请开始一个新的赛博侦探游戏。

游戏配置：
- 难度：normal
- 主题：办公室谋杀案
- 嫌疑人数量：3
- 玩家档案：{"name": "测试侦探", "experience": "中级"}

请使用 game-master 工具执行 start_game 操作，生成完整的案件信息。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 游戏主控Agent响应成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应文本长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用数量: ${result.toolCalls?.length || 0}`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      console.log(`   🎯 工具调用成功: ${toolResult?.success ? '是' : '否'}`);
      if (toolResult?.success) {
        console.log(`   📊 游戏数据: ${JSON.stringify(toolResult.data).substring(0, 100)}...`);
      }
    }
    
    return { success: true, responseTime, result };
    
  } catch (error) {
    console.log('   ❌ 游戏主控Agent测试失败');
    console.log(`   📝 错误: ${error.message}`);
    console.log(`   📝 错误堆栈: ${error.stack?.substring(0, 200)}...`);
    return { success: false, error: error.message };
  }
}

async function testSuspectDialogueAgent() {
  console.log('\n📋 测试2: 嫌疑人对话Agent...');
  
  try {
    if (!client.agent || !client.agent.run) {
      throw new Error('client.agent.run 方法不可用');
    }

    console.log('   🔄 调用嫌疑人对话Agent...');
    
    const startTime = Date.now();
    const result = await client.agent.run({
      agentId: 'suspectDialogueAgent',
      messages: [
        {
          role: 'user',
          content: `请模拟嫌疑人对话。

角色信息：
- 姓名：李秘书
- 性格：谨慎内向
- 背景：工作认真的秘书
- 不在场证明：当时在整理文件
- 可疑程度：4/10
- 是否真凶：否

侦探问题："你当时在哪里？能详细说说你在案发时间的行踪吗？"

请使用 dialogue-management 工具生成自然的对话回应。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 嫌疑人对话Agent响应成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应文本长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用数量: ${result.toolCalls?.length || 0}`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      console.log(`   🎯 工具调用成功: ${toolResult?.success ? '是' : '否'}`);
      if (toolResult?.success) {
        console.log(`   💬 对话回应: ${toolResult.response?.substring(0, 100)}...`);
      }
    }
    
    return { success: true, responseTime, result };
    
  } catch (error) {
    console.log('   ❌ 嫌疑人对话Agent测试失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function testInvestigationAgent() {
  console.log('\n📋 测试3: 调查分析Agent...');
  
  try {
    if (!client.agent || !client.agent.run) {
      throw new Error('client.agent.run 方法不可用');
    }

    console.log('   🔄 调用调查分析Agent...');
    
    const startTime = Date.now();
    const result = await client.agent.run({
      agentId: 'investigationAgent',
      messages: [
        {
          role: 'user',
          content: `请分析当前的调查进度。

案件信息：
- 案件：办公室谋杀案
- 地点：办公室
- 受害者：张经理
- 案发时间：上午10:30

已发现线索：
1. 现场咖啡杯（物理证据，重要性：6/10）

对话历史：
1. 问：你当时在哪里？
   答：我当时在整理文件...

请使用 clue-analysis 工具进行深度分析并提供建议。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 调查分析Agent响应成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应文本长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用数量: ${result.toolCalls?.length || 0}`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      console.log(`   🎯 工具调用成功: ${toolResult?.success ? '是' : '否'}`);
      if (toolResult?.success) {
        console.log(`   📊 分析结果: ${toolResult.analysis?.substring(0, 100)}...`);
      }
    }
    
    return { success: true, responseTime, result };
    
  } catch (error) {
    console.log('   ❌ 调查分析Agent测试失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function testEvaluationAgent() {
  console.log('\n📋 测试4: 推理评估Agent...');
  
  try {
    if (!client.agent || !client.agent.run) {
      throw new Error('client.agent.run 方法不可用');
    }

    console.log('   🔄 调用推理评估Agent...');
    
    const startTime = Date.now();
    const result = await client.agent.run({
      agentId: 'evaluationAgent',
      messages: [
        {
          role: 'user',
          content: `请评估推理结果。

推理信息：
- 选择的真凶：李秘书
- 推理过程：基于对话分析和线索综合判断
- 支持证据：对话内容分析、现场线索关联
- 信心程度：75%

案件信息：
- 真实真凶：李秘书
- 案件难度：normal

游戏历史：
- 发现线索数：1
- 对话轮数：1
- 用时：180秒
- 总时间：300秒

请使用 scoring 工具进行详细评估和打分。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 推理评估Agent响应成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应文本长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用数量: ${result.toolCalls?.length || 0}`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      console.log(`   🎯 工具调用成功: ${toolResult?.success ? '是' : '否'}`);
      if (toolResult?.success) {
        console.log(`   📊 评估结果: 正确=${toolResult.isCorrect}, 总分=${toolResult.totalScore}`);
      }
    }
    
    return { success: true, responseTime, result };
    
  } catch (error) {
    console.log('   ❌ 推理评估Agent测试失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function runAllTests() {
  console.log('🎯 开始完整的Agent集成测试...\n');
  
  const results = {
    gameMaster: null,
    suspectDialogue: null,
    investigation: null,
    evaluation: null
  };

  // 执行所有测试
  results.gameMaster = await testGameMasterAgent();
  results.suspectDialogue = await testSuspectDialogueAgent();
  results.investigation = await testInvestigationAgent();
  results.evaluation = await testEvaluationAgent();

  // 生成测试报告
  console.log('\n' + '='.repeat(60));
  console.log('📊 Agent集成测试报告');
  console.log('='.repeat(60));

  const successCount = Object.values(results).filter(r => r?.success).length;
  const totalTests = Object.keys(results).length;

  console.log(`\n🎯 测试结果: ${successCount}/${totalTests} 通过 (${Math.round(successCount/totalTests*100)}%)`);

  console.log('\n📋 详细结果:');
  console.log(`🤖 游戏主控Agent: ${results.gameMaster?.success ? '✅ 通过' : '❌ 失败'}`);
  console.log(`💬 嫌疑人对话Agent: ${results.suspectDialogue?.success ? '✅ 通过' : '❌ 失败'}`);
  console.log(`🔍 调查分析Agent: ${results.investigation?.success ? '✅ 通过' : '❌ 失败'}`);
  console.log(`📊 推理评估Agent: ${results.evaluation?.success ? '✅ 通过' : '❌ 失败'}`);

  if (successCount === totalTests) {
    console.log('\n🎉 所有Agent集成测试通过！');
    console.log('✅ API调用问题已解决！');
    console.log('🚀 可以进行深度功能测试了！');
  } else if (successCount > 0) {
    console.log('\n👍 部分Agent功能正常，继续调试其他Agent');
  } else {
    console.log('\n⚠️  所有Agent都需要进一步调试');
  }

  console.log('\n🔧 技术细节:');
  console.log('- 使用与前端相同的Mastra配置');
  console.log('- API格式: client.agent.run({ agentId, messages })');
  console.log('- 连接地址: http://localhost:4111');

  console.log('\n' + '='.repeat(60));
  return results;
}

// 运行测试
runAllTests().catch(error => {
  console.error('❌ 测试运行失败:', error);
  process.exit(1);
});
